package testes;

import static implementacao.Constantes.*;
import static org.junit.Assert.*;
import implementacao.Retorno;

import org.junit.Before;
import org.junit.Test;

public class RetornoTest {
	
	private Retorno r;
	
	private static final int PINO_INVALIDO = 50000;

	@Before
	public void setUp() throws Exception {
		r = new Retorno();
	}
	
	@Test
	public void testSetOk() throws Exception {
		r = new Retorno(new int[] {BRANCO, BRANCO, VAZIO, VAZIO});
		r.set(0, PRETO);
		assertEquals(PRETO, r.get(0)); 
	}

	@Test(expected = ArrayIndexOutOfBoundsException.class)
	public void testSetOutOfBounds() throws Exception {
		r.set(r.getSize(), PRETO);
	}

	@Test
	public void testSwapOk() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		r.swap(0, 1);
		Retorno esperado = new Retorno(new int[] {PRETO, BRANCO, VAZIO, VAZIO});
		assertEquals(esperado, r);
	}

	@Test(expected = ArrayIndexOutOfBoundsException.class)
	public void testSwapOutOfBounds() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		r.swap(0, 10);
	}

	@Test
	public void testEqualsTrue() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		Retorno r2 = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		assertTrue(r.equals(r2));
	}

	@Test
	public void testEqualsFalse() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		Retorno r2 = new Retorno(new int[] {BRANCO, PRETO, VAZIO, PRETO});
		assertFalse(r.equals(r2));
	}

	@Test
	public void testEqualsFalse2() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		Retorno r2 = null;
		assertFalse(r.equals(r2));
	}

	@Test
	public void testEqualsFalse3() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		Retorno r2 = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO, VAZIO});;
		assertFalse(r.equals(r2));
	}

	@Test
	public void testToString() throws Exception {
		r = new Retorno(new int[] {BRANCO, PRETO, VAZIO, VAZIO});
		String esperado = "B P _ _ ";
		assertEquals(esperado, r.toString());
	}

	@Test
	public void testToString2() throws Exception {
		r = new Retorno(new int[] {PRETO, VAZIO, BRANCO, PINO_INVALIDO});
		String esperado = "P _ B Erro ";
		assertEquals(esperado, r.toString());
	}

	@Test
	public void testAcertouTodasCoresPosicoesTrue() throws Exception {
		r = new Retorno(new int[] {PRETO, PRETO, PRETO, PRETO});
		assertTrue(r.acertouTodasCoresPosicoes());
	}

	@Test
	public void testAcertouTodasCoresPosicoesFalse() throws Exception {
		r = new Retorno(new int[] {PRETO, PRETO, PRETO, VAZIO});
		assertFalse(r.acertouTodasCoresPosicoes());
	}

}
